package observer.source;

/**
 * 抽象通知者，持有保存所有通知者的集合
 * 往往提供接口增删通知者的数量
 *
 * 观察者模式(发布-订阅模式)：定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象。
 * 这个主题对象在状态发生改变时，会通知所有观察者对象，使他们能够自动更新自己
 *
 * 将一个系统分割成一系列相互协作的类有一个很不好的副作用：需要维护相关对象的一致性。
 * 当一个对象的改变需要同时改变其他对象并且他不知道具体有多少对象有待改变时应该使用观察者模式
 * 总的来说，观察者模式就是解除耦合，让耦合的双方都依赖于抽象而非具体，从而使各自的变化不会影响另一边的变化
 *
 * 但是，观察者模式存在一些问题。
 * 1.每个观察者类都需要实现相同的接口，倘若已经封装好的类可能会引起问题。
 * 2.抽象通知者还是依赖抽象观察者，并没有完全解耦
 * 3.每个具体的观察者不一定要执行update方法，可能需要执行其他方法
 *
 * 配合事件机制(委托)
 * @author Chen Guang
 * @date 2019/4/9 0009 下午 15:45
 */
public interface Subject {
    /**
     * 增加观察者
     * @param observer 观察者
     */
    void attach(Observer observer);

    /**
     * 删除观察者
     * @param observer 观察者
     */
    void detach(Observer observer);

    /**
     * 通知方法
     */
    void notifyObserver();

    /**
     * 获取通知者状态
     * @return Str
     */
    String getSubjectState();

    /**
     * 设置通知者状态
     * @param str 状态
     */
    void setSubjectState(String str);
}
